﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Web.Framework.Controls;
using PlanProd.Contracts;
using WebAppPlanProduccion.Code;
using PlanProd.Contracts.enums;
using Web.Framework;
using WebAppPlanProduccion.Code.Security;
using System.Collections.Specialized;

namespace WebAppPlanProduccion.App
{
    public partial class DesvioOrigenSap : BasePage
    {
        private PlanProduccion PlanProduccion
        {
            //get
            //{
            //    return (PlanProduccion)ViewState["PlanProduccion"];
            //}
            //set
            //{
            //    ViewState["PlanProduccion"] = value;
            //}
            get;
            set;
        }

        private Desvio Desvio
        {
            get
            {
                return (Desvio)ViewState["DesvioPrimera"];
            }
            set
            {
                ViewState["DesvioPrimera"] = value;
            }
        }

        private int PlanProduccionId
        {
            get
            {
                return (int)ViewState["PlanProduccionId"];
            }
            set
            {
                ViewState["PlanProduccionId"] = value;
            }
        }

        private int DetalleProdPrimeraId
        {
            get
            {
                return (int)ViewState["DetalleProdPrimeraId"];
            }
            set
            {
                ViewState["DetalleProdPrimeraId"] = value;
            }
        }

        private int? DetalleProdSegundaId
        {
            get
            {
                return (int?)ViewState["DetalleProdSegundaId"];
            }
            set
            {
                ViewState["DetalleProdSegundaId"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            HasPermissionToSeeMe(PlanProdSecurity.PLANPRODUCCION_DESVIO_VER);

            if (!IsPostBack)
            {
                int desvioId;
                if (this.Request.QueryString["Id"] != null)
                {
                    desvioId = Convert.ToInt32(this.Request.QueryString["Id"]);

                    // Intento obtener el desvio del producto para ese plan
                    Desvio = WebServiceHelper.GetDesvioById(desvioId);

                    PlanProduccionId = Desvio.PlanProduccionId;

                    DetalleProdPrimeraId = Desvio.PlanProduccionDetallePrimeraId;
                    DetalleProdSegundaId = Desvio.PlanProduccionDetalleSegundaId;

                }

                PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId, GetIdsDetalle());

                string seleccioneUnValor = "Sin Valor";

                UIHelper.LoadTipoDesvio(this.cboTipoDesvio, seleccioneUnValor);
                UIHelper.LoadCausaDeDesvio(this.cboDesvioCausa, seleccioneUnValor);

                Bind();
            }
        }

        private List<int> GetIdsDetalle()
        {
            List<int> detallesId = new List<int>();
            detallesId.Add(DetalleProdPrimeraId);

            if (DetalleProdSegundaId.HasValue)
            {
                detallesId.Add(DetalleProdSegundaId.Value);
            }

            return detallesId;
        }

        protected override void ApplySecurity()
        {
            this.cboTipoDesvio.Enabled = false;
            this.cboDesvioCausa.Enabled = false;
        }


        private void Bind()
        {
            bool existeSegunda = DetalleProdSegundaId.HasValue;
            // Lleno las grillas
            PlanProduccionDetalleProd detalleProductoPrimera = PlanProduccion.DetalleDeProductos.Where(d => d.Id == DetalleProdPrimeraId).Single();
            PlanProduccionDetalleProd detalleProductoSegunda = null;
            if (existeSegunda)
            {
                detalleProductoSegunda = PlanProduccion.DetalleDeProductos.Where(d => d.Id == DetalleProdSegundaId.Value).Single();
            }

            // Asignacion de valores controles de encabezado respecto del producto
            this.txtPlanProduccionId.Text = PlanProduccion.Id.ToString();
            this.txtTemporada.Text = PlanProduccion.TemporadaNombre;
            this.txtDestino.Text = PlanProduccion.DestinoNombre;
            this.txtProveedor.Text = PlanProduccion.ProveedorNombre;
            this.txtProductoArticulo.Text = detalleProductoPrimera.ProductoNombre;
            this.txtProductoColor.Text = detalleProductoPrimera.ColorNombreExterno;
            // Asigno valores en el encabezado que corresponden al desvío
            this.txtDesvioId.Text = Desvio.Id.ToString();
            BindAuditory(Desvio);

            if (Desvio.Id == 0)
            {
                this.txtEstado.Text = "No Guardado";

            }
            else
            {
                EstadoCharAprobado estadoDelDesvio = (EstadoCharAprobado)Desvio.Estado[0];
                this.txtEstado.Text = estadoDelDesvio.GetDescription();
                detalleProductoPrimera.DesvioPendienteDeAprobacion = estadoDelDesvio == EstadoCharAprobado.EsperandoAprobacion;

                this.cboDesvioCausa.SelectedValue = Desvio.CausaDesvioId.ToString();
                this.cboTipoDesvio.SelectedValue = ((int)Desvio.TipoDesvio).ToString();
            }

            this.hidEstado.Value = Desvio.Estado;

            this.txtUSuarioCreacion.Text = Desvio.UsuarioCreador;
            this.txtFechaCreacion.Text = Desvio.FechaCreacion.ToString("dd/MM/yyyy");
            this.txtUsuarioAprobador.Text = Desvio.UsuarioAprobador;
            if (Desvio.FechaAprobacion.HasValue)
            {
                this.txtFechaAprobacion.Text = Desvio.FechaAprobacion.Value.ToString("dd/MM/yyyy");
            }


            // Bindeo la grilla

            // La carga del producto depende de si el producto está aprobado o rechazado. Cuando muestro algo aprobado o rechazado, tengo que mostrar la situación origianl
            Temporada temporada = WebServiceHelper.GetTemporadaById(PlanProduccion.TemporadaId);

            CantidadesProducto productoPrimera = CargarDatosProducto(detalleProductoPrimera);
            CantidadesProducto productoPrimeraConCambios = CargarDatosProducto(detalleProductoPrimera);

            CargarDetalleDeCantidadesYDesviosParaProducto(detalleProductoPrimera, productoPrimera, productoPrimeraConCambios, temporada);


            TemporadaComercial temporadaComercial = temporada.ToTemporadaComercial(); //new TemporadaComercial() { FechaDesde = temporada.FechaDesde, FechaHasta = temporada.FechaHasta };

            PlanProdDetalleCambios.ProductoDataSource = productoPrimeraConCambios;
            PlanProdDetalleCambios.BindTemporada = temporadaComercial;

            PlanProdDetalleActual.ProductoDataSource = productoPrimera;
            PlanProdDetalleActual.BindTemporada = temporadaComercial;

            if (detalleProductoPrimera.CalidadId == 2)
            {
                PlanProdDetalleActual.DescPrimera = "Segunda";
                PlanProdDetalleCambios.DescPrimera = "Segunda";
            }

            if (existeSegunda)
            {
                CantidadesProducto productoSegunda = CargarDatosProducto(detalleProductoSegunda);
                CantidadesProducto productoSegundaConCambios = CargarDatosProducto(detalleProductoSegunda);
                CargarDetalleDeCantidadesYDesviosParaProducto(detalleProductoSegunda, productoSegunda, productoSegundaConCambios, temporada);

                PlanProdDetalleCambios.ProductoSegundaDataSource = productoSegundaConCambios;
                PlanProdDetalleActual.ProductoSegundaDataSource = productoSegunda;
            }

            BindGrid();
        }

        private static CantidadesProducto CargarDatosProducto(PlanProduccionDetalleProd detalleProductoPrimera)
        {
            CantidadesProducto producto = new CantidadesProducto();
            producto.Id = detalleProductoPrimera.Id;
            producto.ProductoId = detalleProductoPrimera.ProductoId;
            producto.ProductoIdExterno = detalleProductoPrimera.ProductoIdExterno;
            producto.ProductoNombre = detalleProductoPrimera.ProductoNombre;
            producto.ColorId = detalleProductoPrimera.ColorIdExterno;
            producto.Color = detalleProductoPrimera.ColorNombreExterno;
            producto.CalidadId = detalleProductoPrimera.CalidadId;
            producto.Calidad = detalleProductoPrimera.Calidad;
            producto.Semanas = new List<SemanaCantidadProducto>();
            return producto;
        }

        private void CargarDetalleDeCantidadesYDesviosParaProducto(PlanProduccionDetalleProd detalleProductoPrimera, CantidadesProducto producto, CantidadesProducto productoConCambios, Temporada temporada)
        {
            DesvioDetalle detalleDesvio = null;
            EstadoCharAprobado estadoDesvio = (EstadoCharAprobado)Desvio.Estado[0];

            HybridDictionary hdictionary = temporada.GetHybridNumeroSemanaAnio();

            foreach (var cantidadSemana in detalleProductoPrimera.CantidadesPorSemana)
            {
                SemanaCantidadProducto semana = new SemanaCantidadProducto();
                semana.NumeroSemana = cantidadSemana.NumeroSemana;
                semana.Anio = Convert.ToInt32(hdictionary[cantidadSemana.NumeroSemana]);
                semana.Cantidad = cantidadSemana.Cantidad;
                producto.Semanas.Add(semana);

                detalleDesvio = Desvio.DesvioDetalles.Where(d => d.DetalleProductoCantidadId == cantidadSemana.Id).SingleOrDefault();

                if (detalleDesvio != null)
                {
                    if (estadoDesvio == EstadoCharAprobado.Aprobado || estadoDesvio == EstadoCharAprobado.Rechazado)
                    {
                        semana.Cantidad = detalleDesvio.CantidadInicial; // Muestro la original en la semana de arriba
                    }

                    SemanaCantidadProducto semanaConCambios = new SemanaCantidadProducto();
                    semanaConCambios.NumeroSemana = cantidadSemana.NumeroSemana;
                    semanaConCambios.Anio = Convert.ToInt32(hdictionary[cantidadSemana.NumeroSemana]);
                    semanaConCambios.Cantidad = detalleDesvio.CantidadFinal;
                    semanaConCambios.Destacar = true;
                    semana.Destacar = true;
                    productoConCambios.Semanas.Add(semanaConCambios);
                }
                else
                {
                    productoConCambios.Semanas.Add(semana);
                }
            }
        }

        private void BindGrid()
        {
            this.Grid.DataSource = WebServiceHelper.GetDesvioOrigen(this.Desvio.Id);
            this.Grid.DataBind();
        }

        protected void Grid_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                this.Grid.PageIndex = e.NewPageIndex;

                Bind();
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void Grid_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void Grid_RowDataBound(object sender, GridViewRowEventArgs e)
        {
        }
    }
}